O R possui uma série de funções pré-instaladas, como a mean(), seq(), round(), c(), data.frame() e as demais já utilizadas.
Para utilizar outras funções, é preciso instalar pacotes ou bibliotecas e carregá-las.
#install.packages("tidyverse")
#install.packages("rio")
#library(tidyverse)
#library(rio)Obs: Os pacotes devem ser carregados toda vez que o R for iniciado
Existem duas formas de se utilizar as funções dos pacotes.
A primeira delas já foi explicada. Basta instalar e carregar o pacote para que as funções possam ser utilizadas.
A segunda é utilizando o nome do pacote seguido de dois pontos duplicados -> dplyr:: OU rio::
Caso surja alguma dúvida a respeito do pacote instalado, uma boa opção é consultar o site abaixo: R Package Documentation
É possível identificar o diretório em que o R está operando utilizando a função getwd()
getwd()## [1] "T:/COVAD/Curso R/Aula 2"
E alterar o diretório utilizando a função setwd().
setwd("C:\\Users\\t0080390\\Downloads\\curso_r\\aula2") #1º forma
setwd("C:/Users/t0080390/Downloads/curso_r/aula2") #2º formaIMPORTANTE: as barras do caminho do diretório devem ser duplicadas ou invertidas
Para utilizar uma planilha de excel no R devemos importá-la para o ambiente.
Existem diversas funções para importar planilhas, incluindo algumas próprias do R (como a read.csv ou read.csv2).
No entanto, iremos utilizar a função import() do pacote rio que já foi instalado, uma vez que ela permite a importação de um maior número de extensões de documentos (.csv, .xslx, .ods, etc.)
Existem dois modos de se importar uma planilha:
#O primeiro deles é fixando o diretório e depois utilizar a função import()
setwd("T:\\COVAD\\Curso R\\Aula 2")
jn <- import("jn.xlsx") #Base do relatório Justiça em Números 2019
head(jn[1:5])## ano justica sigla dsc_tribunal uf_sede
## 1 2009 Estadual TJAC TJ - Acre AC
## 2 2010 Estadual TJAC TJ - Acre AC
## 3 2011 Eleitoral TRE-AC TRE - Acre AC
## 4 2011 Estadual TJAC TJ - Acre AC
## 5 2012 Eleitoral TRE-AC TRE - Acre AC
## 6 2012 Estadual TJAC TJ - Acre AC
#O segundo é inserindo o caminho do diretório diretamente na função
jn <- import("T:\\COVAD\\Curso R\\Aula 2\\jn.xlsx")
head(jn[1:5])## ano justica sigla dsc_tribunal uf_sede
## 1 2009 Estadual TJAC TJ - Acre AC
## 2 2010 Estadual TJAC TJ - Acre AC
## 3 2011 Eleitoral TRE-AC TRE - Acre AC
## 4 2011 Estadual TJAC TJ - Acre AC
## 5 2012 Eleitoral TRE-AC TRE - Acre AC
## 6 2012 Estadual TJAC TJ - Acre AC
As planilhas também podem ser exportadas para o diretório desejado utilizando a função export()
#O primeiro deles é fixando o diretório e depois utilizar a função export()
#setwd("T:\\COVAD\\Curso R\\Aula 2")
#export(jn, "teste1.csv") #Base do relatório Justiça em Números 2019
#O segundo é inserindo o caminho do diretório diretamente na função
#export(jn, "T:\\COVAD\\Curso R\\Aula 2\\teste2.csv")
#É possível também salvar a planilha em outra extensão, como xlsx:
#export(jn, "T:\\COVAD\\Curso R\\Aula 2\\teste3.xlsx")
Nesta aula, focaremos nos pacotes Dplyr e Tidyr, mas ainda passaremos pelo ggplot e stringr nas próximas.
O Dplyr (d para data frames e plyr para pliers) é a gramática da manipulação de dados, contendo uma série de verbos (funções) que permitem resolver a maior parte dos desafios relacionados à manipulação.
Ao longo desta aula, passaremos pelas seguintes funções:
filter()
slice ()
select()
arrange()
mutate()
summarise()
group_by()
Na primeira aula, aprendemos a selecionar as colunas de uma base utilizando colchetes
#Selecionar as colunas pelo indexador
jn1 <- jn[,c(1,2,3)]
dim(jn1)## [1] 890 3
#Selecionar as colunas pelos nomes
jn1 <- jn[,c("ano", "justica","sigla")]
dim(jn1)## [1] 890 3
IMPORTANTE: o primeiro argumento de todas as funções é sempre a base de dados
Para selecionar colunas com o dplyr basta usar a função select()
#Selecionar as colunas pelo indexador
jn1 <- select(jn, 1,2,3)
dim(jn1)## [1] 890 3
#Selecionar as colunas pelos nomes
jn1 <- select(jn, ano, justica, sigla)
dim(jn1)## [1] 890 3
#Selecionar as colunas pelo conteúdo do seu nome
jn1 <- select(jn, starts_with("arq"))
Para excluir colunas, basta incluir um sinal de negativo (-) antes do nome da coluna
dim(jn)## [1] 890 1456
jn1 <- select(jn, -starts_with("arq"))
dim(jn1)## [1] 890 1449
Para os próximos exercícios, selecione as seguintes colunas: ano, justica, sigla, uf_sede, uf_abrangida, ftt, g1, g10a, g10b, g10c, g10d
jn <- select(jn, ano, justica, sigla,regiao, starts_with("uf"),ftt, g1, starts_with("g10"))
jn1 <- jn[jn$ano==2018,]
head(jn1[1:5], n=5)## ano justica sigla regiao uf_sede
## 17 2018 Eleitoral TRE-AC Norte AC
## 18 2018 Estadual TJAC Norte AC
## 44 2018 Eleitoral TRE-AL Nordeste AL
## 45 2018 Estadual TJAL Nordeste AL
## 46 2018 Trabalho TRT19 Nordeste AL
jn1 <- jn[jn$uf_abrangida=="Nordeste",]
head(jn1[1:5], n=5)## ano justica sigla regiao uf_sede
## 19 2009 Estadual TJAL Nordeste AL
## 21 2010 Estadual TJAL Nordeste AL
## 24 2011 Estadual TJAL Nordeste AL
## 27 2012 Estadual TJAL Nordeste AL
## 30 2013 Estadual TJAL Nordeste AL
Antes de aprendermos a filtrar, precisamos conhecer os operadores de comparação utilizados no R:
Igualdade: \(==\)
Diferença: \(!=\)
Menor que: \(<\)
Maior que: \(>\)
Menor ou igual: \(<=\)
Maior ou igual: \(>=\)
Lembrem-se, o primeiro argumento das funções do dplyr é SEMPRE A BASE DE DADOS
jn1 <- filter(jn, ano >= 2016)
jn1 <- filter(jn, uf_abrangida == "Sudeste")
jn1 <- filter(jn, uf_abrangida != "Nordeste")É possível filtrar por múltiplas colunas ao mesmo tempo. Para tanto, além dos operadores de comparação, temos que conhecer também os operadores lógicos: “”
“&” ou a vírgula (,) são sinônimos de E, isto é, filtra apenas as observações que cumprem as duas condições
“|” é um sinônimo de OU, ou seja, filtra as observações que cumprem uma observação ou a outra
jn1 <- filter(jn, ano == 2016 & uf_sede == "SP")
nrow(jn1)## [1] 6
jn1 <- filter(jn, ano == 2016 | uf_sede == "SP")
nrow(jn1)## [1] 146
Para filtrar múltiplos valores de uma única coluna é necessário usar o operador %in%
jn1 <- filter(jn, ano %in% c(2016,2018))
jn1 <- filter(jn, sigla %in% c("TJMG", "TJSP", "TJRJ", "TJRS") &
g10d>7000)
A função slice() serve para selecionar linhas específicas da base de dados
jn1 <- slice(jn, 1:5) #seleciona da primeira à quinta linha
jn1 <- slice(jn, 890:n()) #seleciona da 890 à última linha
jn1 <- slice(jn, -1:-4) #Exclui as 4 primeiras linhas
A função arrange() corresponde à classificação da base de dados a partir dos valores das colunas. Assim como no Excel, é possível classificar uma ou mais colunas em ordem crescente ou decrescente (basta colocar o nome da coluna dentro do argumento desc()).
jn1 <- arrange(jn, ano, uf_sede)
head(jn1, n=5)## ano justica sigla regiao uf_sede uf_abrangida ftt g1
## 1 2009 Estadual TJAC Norte AC Norte 1813 0.014827827
## 2 2009 Estadual TJAL Nordeste AL Nordeste 2426 0.006583269
## 3 2009 Trabalho TRT19 Nordeste AL Alagoas 793 0.004438447
## 4 2009 Estadual TJAM Norte AM Norte 2650 0.004294022
## 5 2009 Trabalho TRT11 Norte AM Amazonas e Roraima 1203 0.004107223
## g10a g10b g10c g10d
## 1 NA NA NA 2658.065
## 2 NA NA 18117.33 4369.663
## 3 NA NA 16748.71 8057.550
## 4 NA NA 22532.21 5064.874
## 5 NA NA 32207.87 NA
jn1 <- arrange(jn, desc(ano), ftt)
head(jn1, n=5)## ano justica sigla regiao uf_sede uf_abrangida ftt
## 1 2018 Militar Estadual TJMRS Sul RS Rio Grande do Sul 141
## 2 2018 Militar Estadual TJMMG Sudeste MG Minas Gerais 179
## 3 2018 Eleitoral TRE-RR Norte RR Roraima 247
## 4 2018 Militar Estadual TJMSP Sudeste SP São Paulo 258
## 5 2018 Eleitoral TRE-AC Norte AC Acre 261
## g1 g10a g10b g10c g10d
## 1 7.354124e-05 608144.0 125218.3 36757.04 7706.516
## 2 9.493060e-05 784555.4 227058.2 43905.69 9689.269
## 3 4.305523e-03 128028.3 253306.8 50116.18 1766.383
## 4 3.088603e-05 567693.5 179676.6 36326.23 11193.814
## 5 4.492207e-03 113856.8 225363.4 33220.20 10688.216
O objetivo da função mutate() é permitir criar novas colunas a partir das já existentes
#Criar uma nova coluna que corresponde à média de despesa por funcionário
jn1 <- mutate(jn, med_func= (g10a+g10b+g10c+g10d)/4)
#Criar uma nova coluna que corresponde a quantas vezes as categorias de funcionários ganham em relação às outras
jn1 <- mutate(jn, mag_serv= (g10a/g10b), serv_terc=(g10b/g10c), terc_est=(g10c/g10d))
jn1 %>% filter (ano==2017, justica=="Estadual") %>% select(3,13,14,15) %>% head(n=5)## sigla mag_serv serv_terc terc_est
## 1 TJAC 5.530942 4.487870 1.296539
## 2 TJAL 4.453916 3.477776 2.334373
## 3 TJAM 3.243453 1.238992 17.435706
## 4 TJAP 3.636119 5.547056 3.861168
## 5 TJBA 3.296825 4.895988 4.832222
A função summarise() visa obter estatísticas da base por colunas
Por exemplo, podemos obter a média das despesas por magistrados, servidores, terceirizados ou estagiários
summarise(jn, media_mag=mean(g10a, na.rm=T))## media_mag
## 1 416383.1
summarise(jn, media_serv=mean(g10b, na.rm=T))## media_serv
## 1 186989.7
summarise(jn, media_ter=mean(g10c, na.rm=T))## media_ter
## 1 38330.61
summarise(jn, media_est=mean(g10d, na.rm=T))## media_est
## 1 9642.114
Todas as manipulações realizadas até então podem ser aplicadas a grupos, ao invés de aplicadas à base de dados inteira
Como descobrir quais são 5 Tribunais que pagam os melhores salários aos servidores em 2018?
jn1 <- filter(jn, ano==2018)
jn1 <- arrange(jn1, desc(g10b))
jn1 <- slice(jn1, 1:5) #Esses códigos podem ser substituídos pela função top_n
jn1$sigla## [1] "TRE-AP" "JMU" "STM" "TRT10" "TRT12"
Como descobrir quais são 3 Tribunais que pagam os melhores salários aos servidores por justiça?
jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica) #Agrupando por justiça
jn1 <- arrange(jn1, desc(g10b)) #Após agrupar, o restante do algoritmo é o mesmo
jn1 <- slice(jn1, 1:3)
jn1[c(2,3)]## # A tibble: 19 x 2
## # Groups: justica [7]
## justica sigla
## <chr> <chr>
## 1 Eleitoral TRE-AP
## 2 Eleitoral TRE-RN
## 3 Eleitoral TRE-AL
## 4 Estadual TJDFT
## 5 Estadual TJBA
## 6 Estadual TJTO
## 7 Federal TRF4
## 8 Federal TRF
## 9 Federal TRF2
## 10 Militar Estadual TJMMG
## 11 Militar Estadual TJMSP
## 12 Militar Estadual TJM
## 13 Militar Uniao JMU
## 14 Superior STM
## 15 Superior STJ
## 16 Superior TSE
## 17 Trabalho TRT10
## 18 Trabalho TRT12
## 19 Trabalho TRT1
Já calculamos qual é a média geral dos salários dos servidores. Agora, qual é a média dos salários dos servidores por região em 2018?
jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, regiao)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc))
jn1## # A tibble: 6 x 2
## regiao med_venc
## <chr> <dbl>
## 1 União 236680.
## 2 Sul 208886.
## 3 Norte 208337.
## 4 Sudeste 208139.
## 5 Nordeste 201151.
## 6 Centro-Oeste 198556.
E por justiça?
jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc))
jn1## # A tibble: 7 x 2
## justica med_venc
## <chr> <dbl>
## 1 Militar Uniao 302120.
## 2 Superior 265222.
## 3 Trabalho 248232.
## 4 Federal 245277.
## 5 Eleitoral 207063.
## 6 Militar Estadual 177839.
## 7 Estadual 162892.
E por justiça e região? Sim, é possível agrupar por mais de uma coluna
jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica, regiao)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc), justica, regiao)
jn1## # A tibble: 27 x 3
## # Groups: justica [7]
## justica regiao med_venc
## <chr> <chr> <dbl>
## 1 Militar Uniao União 302120.
## 2 Trabalho União 272687.
## 3 Superior União 265222.
## 4 Federal Sul 262558.
## 5 Trabalho Sul 261326.
## 6 Trabalho Norte 248115.
## 7 Trabalho Sudeste 247045.
## 8 Federal Sudeste 243577.
## 9 Federal União 242590.
## 10 Trabalho Centro-Oeste 241756.
## # ... with 17 more rows
Em várias ocasiões as informações de que precisamos estão divididas em duas ou mais tabelas, que possuem em comum apenas uma única variável (chave)
Se o nosso objetivo é obter todas as colunas da tabela 2, cujos IDs também existem na tabela 1, devemos usar o left-join:
# Importar as duas bases que serão unidas
jn1 <- import("jn1.xlsx")
jn2 <- import("jn2.xlsx")
# Executar a função left join
jn3 <- left_join(x=jn1, y=jn2, by=c("ID"="ID")) #Usar o argumento "by" quando as chaves não possuírem o mesmo nome
jn3 <- left_join(x=jn1, y=jn2) #Se as chaves possuem o mesmo nome, o "by" é desnecessário## Joining, by = "ID"
Em várias situações, precisaremos utilizar várias funções para completar um único objetivo: média de salário dos serviores por região, por exemplo.
Para evitar a criação de vários objetos ou sobrescrever um deles várias vezes, podemos aninhar funções.
#Calcular a média da proporção de salários dos magistrados em relação aos servidores por região em 2018
jn1 <- arrange(summarise(group_by(mutate(filter(jn, ano==2018), mag_serv=g10a/g10b), regiao),med_mag_serv=mean(mag_serv, na.rm = T)), desc(med_mag_serv))
jn1## # A tibble: 6 x 2
## regiao med_mag_serv
## <chr> <dbl>
## 1 Centro-Oeste 2.57
## 2 Sul 2.46
## 3 Sudeste 2.22
## 4 Norte 2.15
## 5 Nordeste 2.15
## 6 União 1.98
Ao invés de concatenar inúmeras funções deixando o código totalmente ilegível, podemos usar o operador pipe \(%>%\) através do atalho ctrl+shift+m.
Em termos simples, o operador pipe “pega” o resultado da operação anterior e o utiliza como o input do primeiro argumento da função seguinte. É justamente por isso que ele é tão útil combinado com as funções do dplyr: todas as funções geram um data frame e demandam como primeiro argumento um data frame!!!
jn1 <- jn %>% filter(ano==2018) %>% mutate(mag_serv=g10a/g10b) %>%
group_by(regiao) %>% summarise(med_mag_serv=mean(mag_serv, na.rm = T)) %>%
arrange(desc(med_mag_serv))
jn1## # A tibble: 6 x 2
## regiao med_mag_serv
## <chr> <dbl>
## 1 Centro-Oeste 2.57
## 2 Sul 2.46
## 3 Sudeste 2.22
## 4 Norte 2.15
## 5 Nordeste 2.15
## 6 União 1.98